package com.dji.sdk.mqtt;

/**
 * MQTT通信统一请求格式基类 所有MQTT请求的基类
 *
 * 该类是DJI Cloud API MQTT通信中所有请求消息的基础类，定义了所有请求消息共有的属性和方法。
 * 在DJI Cloud API的MQTT通信架构中，不同类型的消息（如requests、events、services等）
 * 都继承自该类，并添加各自特有的字段。
 *
 * 主要特点和作用：
 * 1. 提供统一的消息结构，简化消息处理逻辑
 * 2. 包含请求追踪所需的tid(事务ID)和bid(业务ID)字段
 * 3. 支持泛型数据载荷，适应不同业务场景的数据需求
 * 4. 实现链式调用风格的setter方法，提高代码可读性
 *
 * @author sean.zhou
 * @date 2021/11/10
 * @version 0.1
 */
public class CommonTopicRequest<T> {

    /**
     * 事务ID
     * 命令发送和响应通过消息中的tid和bid字段匹配，回复应保持tid和bid相同。
     * 用于标识一次完整的请求-响应事务，确保响应能与请求正确关联。
     */
    protected String tid;

    /**
     * 业务ID
     * 用于标识特定业务流程，多个相关的请求-响应事务可能共享同一个bid。
     * 有助于跟踪和关联属于同一业务流程的多个消息。
     */
    protected String bid;

    /**
     * 时间戳
     * 记录消息创建的时间，用于消息排序、超时判断等场景。
     * 通常使用UNIX时间戳（毫秒级）。
     */
    protected Long timestamp;

    /**
     * 数据载荷
     * 泛型设计，可以承载不同类型的业务数据。
     * 具体数据结构由泛型参数T决定，根据不同的消息类型和业务场景变化。
     */
    protected T data;

    public CommonTopicRequest() {
    }

    @Override
    public String toString() {
        return "CommonTopicRequest{" +
                "tid='" + tid + '\'' +
                ", bid='" + bid + '\'' +
                ", timestamp=" + timestamp +
                ", data=" + data +
                '}';
    }

    public String getTid() {
        return tid;
    }

    public CommonTopicRequest<T> setTid(String tid) {
        this.tid = tid;
        return this;
    }

    public String getBid() {
        return bid;
    }

    public CommonTopicRequest<T> setBid(String bid) {
        this.bid = bid;
        return this;
    }

    public Long getTimestamp() {
        return timestamp;
    }

    public CommonTopicRequest<T> setTimestamp(Long timestamp) {
        this.timestamp = timestamp;
        return this;
    }

    public T getData() {
        return data;
    }

    public CommonTopicRequest<T> setData(T data) {
        this.data = data;
        return this;
    }
}